package texas

import (
	"fmt"
)


type Decision struct {
	
}


// 分析起手牌的是否在特定的牌型范围
func (dec *Decision) justifyMode(myCards []Card, pointMax int, pointMin int, plus bool, isuit bool) bool{
	// 对本函数进行一些说明：本函数仅对第一轮手牌进行策略判断
	// pointMax表示最大纸牌点数，pointMin表示最小纸牌点数， plus用于表示是否向上匹配， isuit表示是否同花匹配
	// 现进行举例详细说明：
	// 22+(大于等于22的口袋对: 2, 2, true, false)
	// 45s+(大于等于45的同花连续牌对,如5c6c: 5, 4, true, true)
	// 46o+(大于等于46的同花要求的间隔牌对,如5c7s: 6, 4, true, true)
	// 另外,对于A2s+(大于等于A2的A*牌,如A3: 14, 2, plus+true, true)
	colors := make([]int, 0)
	points := make([]int, 0)
	for _, card := range myCards {
		colors = append(colors, card.Suit)
		points = append(points, card.Value)
	}
	maxp := Max(points)
	minp := Min(points)
	maxc := Max(colors)
	minc := Min(colors)

	// 记录牌值间隔
	delta := pointMax - pointMin
	// 是否上匹配
	if plus {
		if pointMax == maxp && maxp == 12 && minp >= pointMin {
			if isuit &&	maxc != minc{
			}else{
				return true
			}
		}
	}else if pointMax != 12 && maxp == minp + delta && minp >= pointMin {
		// 设置同花标志，同时判断只有一种花色
		if isuit && maxc != minc {
		} else {
			return true
		}
	}
	// 要求精确匹配 else:
	if maxp == pointMax && minp == pointMin {
		// 设置同花标志，同时判断只有一种花色
		if isuit && maxc != minc {
		} else {
			return true
		}
	}
	return false

}

/*起手牌分析过程，分析是否应该玩一手牌
分析手牌，然后确定是否应该加入牌局
对于tightPolicy，其表示我们在玩牌时的松紧策略
*/
func (dec *Decision) handCardsHandle(mycards []Card, myseatrole int, tightPolicy int) bool {
	// tightPolicy表示是否实行紧方式
	// inFlag 用于表示是否决定玩一手牌。
	// 位置划分：
	// ep（前位）：8--大盲注后两个，4/3---依次递减
	// mp（中位）：8--EP后两个，6/5---依次递减
	// lp（末位）：8--MP后一个，7删除
	// button（庄家）
	// blind（大小盲注）
	// 这里，我们使用经验，选择执行20%策略
	// 基于概率事件，通过经验：
	// ep: 44+/AKo/ATs+/AQo+
	// mp: 33+/A8s+/ATo+/KJo+
	// lp: 22+/A2s+
	// button: 22+/A2s+/T9s+/AJo+
	// blind: 22+/AKo/AQs/AJs/KQs
	// 另外，对于松机制
	// 所有：22+/AJo+/A4s+/98s+/KQo/KJs
	inFlag := false
	// 使用最紧机制
	// 最紧机制通常适用于这样的情况：
	// 1、起手牌时，对手中存在all_in时，实行最紧策略，不要轻易all_in
	// 2、当自己的金钱远远大于第二名时，实行最紧策略。原因在于不要轻易加入牌局，除非自己有着极大的赢牌几率
	// 3、当牌局的紧策略玩家出现加注和all_in操作时，我们实行最紧机制
	if tightPolicy == 3 {
		inFlag = dec.justifyMode(mycards, 6, 6, true, false) ||
			dec.justifyMode(mycards, 14, 13, false, false) ||
			dec.justifyMode(mycards, 14, 10, true, true) ||
			dec.justifyMode(mycards, 13, 12, true, true)
	} else if tightPolicy == 2 {
		// 使用紧机制
		// 紧机制通常适用于这样一些情况：
		// 1、当自己的金钱为第一名且稍微领先第二名时，实行紧策略
		// 2、当牌局的紧策略玩家出现跟注时，我们实行紧机制
		if PlayerRole[myseatrole] == "EP" {
			inFlag = dec.justifyMode(mycards, 3, 3, true, false) ||
			dec.justifyMode(mycards, 14, 13, false, false) ||
			dec.justifyMode(mycards, 14, 10, true, true) ||
			dec.justifyMode(mycards, 14, 12, false, false) ||
			dec.justifyMode(mycards, 13, 12, false, false)
		} else if PlayerRole[myseatrole] == "MP" {
			inFlag = dec.justifyMode(mycards, 3, 3, true, false) ||
			dec.justifyMode(mycards, 14, 9, true, true) ||
			dec.justifyMode(mycards, 14, 12, true, false) ||
			dec.justifyMode(mycards, 13, 11, true, false) ||
			dec.justifyMode(mycards, 13, 12, false, false)
		} else if PlayerRole[myseatrole] == "LP" {
			inFlag = dec.justifyMode(mycards, 3, 3, true, false) ||
			dec.justifyMode(mycards, 9, 8, true, true) ||
			dec.justifyMode(mycards, 14, 9, true, true) ||
			dec.justifyMode(mycards, 14, 11, true, false) ||
			dec.justifyMode(mycards, 13, 12, false, false)
		} else if PlayerRole[myseatrole] == "BTN" {
			inFlag = dec.justifyMode(mycards, 3, 3, true, false) ||
			dec.justifyMode(mycards, 14, 9, true, true) ||
			dec.justifyMode(mycards, 10, 9, true, true) ||
			dec.justifyMode(mycards, 14, 11, true, false)
		} else if PlayerRole[myseatrole] == "SB" || PlayerRole[myseatrole] == "BB"{
			inFlag = dec.justifyMode(mycards, 3, 3, true, false) ||
			dec.justifyMode(mycards, 7, 6, true, true) ||
			dec.justifyMode(mycards, 14, 13, false, false) ||
			dec.justifyMode(mycards, 14, 11, false, true) ||
			dec.justifyMode(mycards, 13, 12, false, true)
		}

	} else if tightPolicy == 1 {
		// 使用最松机制
		inFlag = dec.justifyMode(mycards, 2, 2, true, false) ||
		dec.justifyMode(mycards, 14, 5, true, false) ||
		dec.justifyMode(mycards, 14, 2, true, true) ||
		dec.justifyMode(mycards, 10, 9, true, true) ||
		dec.justifyMode(mycards, 13, 12, false, false) ||
		dec.justifyMode(mycards, 13, 11, false, true) ||
		dec.justifyMode(mycards, 13, 10, false, true) ||
		dec.justifyMode(mycards, 12, 9, false, false)
	}else if tightPolicy == 0 {
		// 最后这一种，实行的机制最松
		// 22+/A8+/A2s+/76s+/109+/97s+/KJ/K10/K9s/Q10/Q9s/Q8s
		// 那么，哪些情况下实行最松机制呢？
		// 1、对于当自己的经济状况处于5-6名次时，同样执行最松机制，但是执行的方法为all_in
		// 2、自暴自弃：当自己的经济状况处于7-8名·，执行全all_in机制————投机方法
		inFlag = dec.justifyMode(mycards, 2, 2, true, false) ||
		dec.justifyMode(mycards, 14, 8, true, false) ||
		dec.justifyMode(mycards, 14, 4, true, true) ||
		dec.justifyMode(mycards, 9, 8, true, true) ||
		dec.justifyMode(mycards, 13, 11, false, false) ||
		dec.justifyMode(mycards, 13, 10, false, false) ||
		dec.justifyMode(mycards, 13, 9, false, false) ||
		dec.justifyMode(mycards, 13, 8, false, true) ||
		dec.justifyMode(mycards, 12, 10, false, false) ||
		dec.justifyMode(mycards, 12, 9, false, true) ||
		dec.justifyMode(mycards, 12, 8, false, true)
	}

	if inFlag {
		//writeLog("\nHand Round: Join this set!!!")
		fmt.Println("Hand Round: Join this set!!!")
	}else {
		//writeLog("\nHand Round: Do not join this set!!!")
		fmt.Println("\nHand Round: Do not join this set!!!")
	}
	return inFlag
}



// 翻牌轮后分析牌型和价值
func (dec *Decision) parseFlopRoundLevel(flopcards []Card) {
	//"Return a value indicating how high the hand ranks"
	// counts元组保存每种牌型值的个数
	// points元组保存不同牌型值，并且按照大小排序（count值越大越优先）
	// Eg. '7 T 7 9 7' => counts=(3,1,1) points=(7,10,9)
	hand := GetHand()
	hand.Init()
	for _, v := range flopcards {
		hand.SetCard(&v)
	}
	hand.AnalyseHand()

	// 对于顺子(A,2,3,4,5), 规定其值为(1,2,3,4,5)

	// 判断是否为顺子:
	// 五张牌数值各不同，同时最大牌与最小牌相差4

	// 判断是否为同花：
	// 五张牌花色相同

	// 这里我们判断9种牌型：同花顺、四条、葫芦、同花、顺子、三条、两对、一对、高牌
	level := hand.Level
	// 打印该五张牌的信息
	fmt.Println("Cards level:", level)

	// 打印该五张牌的牌型有多少种大小
	//print 'Points Count: ', len(points)

	// 计算牌型价值
	value := hand.FinalValue
	fmt.Println("Cards Value: ", value)

}


//
//func (dec *Decision) parseRaisePolicy(gameinfo){
//
////判定玩这手牌的松紧策略
////对于经济差距较大的情况，
//
//if gameinfo.gameNum <= 10:
//tightPolicy = 0
//return tightPolicy
//
//money = []
//for player in gameinfo.players:
//money.append(int(player.money)+int(player.jetton))
//myid = gameinfo.myid
//me = gameinfo.myplayer
//myrank = me.rank
//// sumrank = len(gameinfo.players)
//
//// 这里，有必要解释一下应该选择怎样的策略：
//// 如果我不是第一名但是又在前4，那么我们就玩得稍微松一点，如果在后面，就玩最松的牌
//// 如果我是第一名，那么必然玩紧牌，我们这里定义了一个阈值，超过阈值，就最紧，否则，稍稍紧一点就行
//if myrank != 1:
//// 这个地方，首先看看自己是什么名次，如果在前4名，那么就选择较紧策略，否则就选择最松策略
//// 你都快要死了，还要紧有个屁用。所以，实行松机制，没钱不疯狂一下？？
//if myrank <= 6:
//tightPolicy = 1
//else:
//tightPolicy = 0
//else:
//mymoney = int(me.money)
//myjetton = int(me.jetton)
//allmoney = sum(money)
//secondMoney = sorted(money, reverse=True)[1]
//smallMoneyGap = 0.10 * (mymoney + myjetton)
//bigMoneyGap = 0.40 * (mymoney + myjetton)
//greatMoneyGap = 0.16 * allmoney
//gapMoney = mymoney - secondMoney
//
//// 当经济差距较大时，实行紧机制，越有钱就越不能任性
//if gapMoney >= smallMoneyGap :
//tightPolicy = 2
//elif gapMoney >= bigMoneyGap:
//tightPolicy = 3
//elif gapMoney >= greatMoneyGap:
//tightPolicy = 4
//
//return tightPolicy